<?php

// Acciones constants
define('ACTION_NOT_PERMITTED', 0);
define('ACTION_PERMITTED',     1);

// Model class
class AccionesModel extends CustomModel
{

    public function getAcciones($update = false)
    {
        $abmAcciones = new ABM('acciones');
        $actions = $abmAcciones->get(new dbFilter('idaccion', '>', 0));
        if ($update)
        {
            $this->updateDbActions($actions);
        }
        return $actions;
    }

    private function updateDbActions(&$actions)
    {
        $systemActions = $this->getSystemActions();
        $groupedActions = $this->groupDbActionsByModule($actions);
        // Check if inside system actions
        if (!empty($actions))
        {
            $toInsert = array();
            foreach ($systemActions as $module => $moduleActions)
            {
                if (!empty($moduleActions))
                {
                    foreach($moduleActions as $moduleAction)
                    {
                        if ((!isset($groupedActions[$module])) || (!isset($groupedActions[$module][$moduleAction])))
                        {
                            $toInsert[]=array('modulo' => $module, 'accion' => $moduleAction, 'nombre' => ucfirst($module).' - '.ucfirst($moduleAction), 'permiso_default' => ACTION_NOT_PERMITTED);
                        }
                    }
                }
            }
        }
        else
        {
            $toInsert = $systemActions;
        }
        // Insert to db (if any)
        if (!empty($toInsert))
        {
            $abmAcciones = new ABM('acciones');
            $error = false;
            $this->db->beginTransaction();
            foreach ($toInsert as $newAction)
            {
                if (!$abmAcciones->insert($newAction))
                {
                    $error = true;
                    $this->db->rollBackTransaction();
                    break;
                }
            }
            if (!$error)
            {
                $this->db->commitTransaction();
            }
            $actions = $abmAcciones->get(new dbFilter('idaccion', '>', 0));
        }
        // Always return true
        return true;
    }

    private function getSystemActions()
    {
        // Systema actions
        $modules = Modules::getInstance();
        $actions = $modules->getActions();
        return $actions;
    }

    private function groupDbActionsByModule($dbActions)
    {
        if (!empty($dbActions))
        {
            $actions = array();
            foreach ($dbActions as $action)
            {
                if (!isset($actions[$action['modulo']]))
                {
                    $actions[$action['modulo']] = array();
                }
                $actions[$action['modulo']][$action['accion']] = $action['permiso_default'];
            }
            return $actions;
        }
        else
        {
            return false;
        }
    }

    public function getPaginatedAcciones($pageNumber)
    {
        $accionesAbm = new ABM('acciones');
        return $accionesAbm->getPaginated($pageNumber, new dbFilter('visibilidad', '=', STATUS_ONLINE), 10, 'modulo ASC', true);
    }

    public function getUsuarios($pageNumber)
    {
        $usuariosAbm = new ABM('users');
        $filter = array(
            'user_status' => STATUS_ONLINE,
            'user_type'   => USER_TYPE_ADMIN,
        );
        $joins = array(
            'roles' => array(
                'type' => 'LEFT',
                'on'   => array('roles.idrol' => 'users.fkrol')
            )
        );
        return $usuariosAbm->getPaginatedWithJoin($pageNumber, $filter, $joins, 10, 'users.username ASC', true);
    }

    public function getUsuario($idUser)
    {
        $usuariosAbm = new ABM('users');
        if ($user = $usuariosAbm->get(array('iduser' => $idUser, 'user_status' => STATUS_ONLINE)))
        {
            $user = $user[$idUser];
            if (!empty($user['fkrol']))
            {
                // Rol data
                $rolModel = new RolesModel();
                $rol = $rolModel->getRol($user['fkrol']);
                $user['rol'] = $rol;
                // Acciones propias del usuario
                $user['acciones'] = array('permitidas' => array(), 'no_permitidas' => array());
                $accionesPorUsuarioAbm = new ABM('acciones_por_usuario');
                $accionesPorUsuario = $accionesPorUsuarioAbm->getWithJoin(array('fkuser' => $idUser), array('acciones' => array('acciones.idaccion' => 'acciones_por_usuario.fkaccion')), false, false, false);
                if (!empty($accionesPorUsuario))
                {
                    foreach ($accionesPorUsuario as $accion)
                    {
                        if ($accion['permiso'] == STATUS_ONLINE)
                        {
                            if (isset($user['rol']['acciones']['no_permitidas'][$accion['idaccion']]))
                            {
                                unset($user['rol']['acciones']['no_permitidas'][$accion['idaccion']]);
                            }
                            $user['rol']['acciones']['permitidas'][$accion['idaccion']] = $accion;

                        }
                        else if ($accion['permiso'] == STATUS_OFFLINE)
                        {
                            if (isset($user['rol']['acciones']['permitidas'][$accion['idaccion']]))
                            {
                                unset($user['rol']['acciones']['permitidas'][$accion['idaccion']]);
                            }
                            $user['rol']['acciones']['no_permitidas'][$accion['idaccion']] = $accion;
                        }
                    }
                }
            }
            else
            {
                return false;
            }
            return $user;
        }
        else
        {
            return false;
        }
    }

    public function guardarAcciones($idUser, $acciones)
    {

        // Delete current
        $delAccionesPorUsuario = "DELETE FROM acciones_por_usuario WHERE fkuser = $idUser;";
        if (!$this->db->rawQuery($delAccionesPorUsuario))
        {
            $this->db->rollbackTransaction();
            return false;
        }
        if (!empty($acciones))
        {
            // Insert
            $accionesPorUsuarioAbm = new ABM('acciones_por_usuario');
            foreach ($acciones as $idAccion => $permiso)
            {
                $accionPorUsuario = array(
                    'fkuser'   => $idUser,
                    'fkaccion' => $idAccion,
                    'permiso'  => $permiso
                );
                if ($accionesPorUsuarioAbm->insert($accionPorUsuario, false))
                {
                    // foo
                }
                else
                {
                    $this->db->rollbackTransaction();
                    return false;
                }
            }
        }
        return true;
    }

    public function getAccionesDelRol($fkRol)
    {
        $rolModel = new RolesModel();
        $rol = $rolModel->getRol($fkRol);
        return $rol;
    }

    public function accionPermitida($idUser, $nombreModulo, $nombreAccion)
    {
        $acciones = $this->getAcciones();
        $idAccion = false;
        foreach ($acciones as $accion)
        {
            if (($accion['modulo'] == $nombreModulo) && ($accion['accion'] == $nombreAccion))
            {
                $idAccion = $accion['idaccion'];
            }
        }
        if ($idAccion)
        {
            $accionesDelUsuario = $this->getUsuario($idUser);
            if (isset($accionesDelUsuario['rol']['acciones']))
            {
                if (isset($accionesDelUsuario['rol']['acciones']['permitidas'][$idAccion]))
                {
                    return true;
                }
                else if (!isset($accionesDelUsuario['rol']['acciones']['no_permitidas'][$idAccion]))
                {
                    if($acciones[$idAccion]['permiso_default'] == STATUS_ONLINE)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    
    public function cambiarPermiso($id)
    {
        $abmAcciones = new ABM('acciones');
        if ($accion = ($abmAcciones->get(array('idaccion' => $id, 'visibilidad' => STATUS_ONLINE))))
        {
            $accion = $accion[$id];
            if ($accion['permiso_default'] == STATUS_ONLINE)
            {
                $nuevo = STATUS_PENDING;
            }
            else
            {
                $nuevo = STATUS_ONLINE;
            }
            if ($abmAcciones->update(array('idaccion' => $id), array('permiso_default' => $nuevo)))
            {
                return array('permiso_nuevo' => $nuevo);
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    
}

?>